/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ar.com.hardcodeando.ui;

import ar.com.hardcodeando.algorithm.MD5;
import ar.com.hardcodeando.dto.MD5DTO;
import ar.com.hardcodeando.ui.utils.AlgorithmStateStorage;
import ar.com.hardcodeando.ui.utils.MyCellEditor;
import ar.com.hardcodeando.ui.utils.StatusColumnCellRenderer;
import java.awt.Color;
import java.io.IOException;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

/**
 *
 * @author estefi
 */
public class MD5PanelEvaluar extends javax.swing.JPanel {
    

    private MyCellEditor myCellEditor=null;    
    /**
     * Creates new form MD5Panel
     */
    public MD5PanelEvaluar() {
        
        initComponents();
        tablaPaso4.getColumnModel().getColumn(1).setCellEditor(new MyCellEditor());        
        tablaPaso4.getColumnModel().getColumn(2).setCellEditor(new MyCellEditor());        
        tablaPaso4.getColumnModel().getColumn(3).setCellEditor(new MyCellEditor());        
        tablaPaso4.getColumnModel().getColumn(4).setCellEditor(new MyCellEditor());
        
        tablaPaso4.getColumnModel().getColumn(1).setCellRenderer(new StatusColumnCellRenderer());        
        tablaPaso4.getColumnModel().getColumn(2).setCellRenderer(new StatusColumnCellRenderer());        
        tablaPaso4.getColumnModel().getColumn(3).setCellRenderer(new StatusColumnCellRenderer());        
        tablaPaso4.getColumnModel().getColumn(4).setCellRenderer(new StatusColumnCellRenderer());
                        
        jTabbedPane1.setEnabledAt(1, false);
        jTabbedPane1.setEnabledAt(2, false);
        jTabbedPane1.setEnabledAt(3, false);
        jTabbedPane1.setEnabledAt(4, false);
        jTabbedPane1.setEnabledAt(5, false);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        grupoPreg1 = new javax.swing.ButtonGroup();
        grupoPreg2 = new javax.swing.ButtonGroup();
        grupoPreg3 = new javax.swing.ButtonGroup();
        grupoPreg4 = new javax.swing.ButtonGroup();
        grupoPreg5 = new javax.swing.ButtonGroup();
        buttonGroupPasos = new javax.swing.ButtonGroup();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        IntroMD5 = new javax.swing.JPanel();
        botContinuarPreguntas = new javax.swing.JButton();
        rbcorrecto1 = new javax.swing.JRadioButton();
        rbincorrecto12 = new javax.swing.JRadioButton();
        rbincorrecto13 = new javax.swing.JRadioButton();
        jLabel31 = new javax.swing.JLabel();
        rbcorrecto2 = new javax.swing.JRadioButton();
        rbincorrecto2 = new javax.swing.JRadioButton();
        rbincorrecto3 = new javax.swing.JRadioButton();
        jLabel33 = new javax.swing.JLabel();
        rbincorrecto32 = new javax.swing.JRadioButton();
        rbcorrecto3 = new javax.swing.JRadioButton();
        rbincorrecto31 = new javax.swing.JRadioButton();
        jLabel34 = new javax.swing.JLabel();
        jLabel35 = new javax.swing.JLabel();
        rbincorrecto42 = new javax.swing.JRadioButton();
        rbincorrecto41 = new javax.swing.JRadioButton();
        rbcorrecto4 = new javax.swing.JRadioButton();
        botCorregirPreguntas = new javax.swing.JButton();
        botReintentarPreguntas = new javax.swing.JButton();
        botResolverPreguntas = new javax.swing.JButton();
        jLabel36 = new javax.swing.JLabel();
        rbincorrecto14 = new javax.swing.JRadioButton();
        rbcorrecto5 = new javax.swing.JRadioButton();
        rbincorrecto15 = new javax.swing.JRadioButton();
        panelPaso1 = new javax.swing.JPanel();
        lblHeaderPaso3 = new javax.swing.JLabel();
        botonSiguientePaso1AE = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        mensajeAEncriptar = new javax.swing.JTextField();
        jLabel66 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        representacionBinaria = new javax.swing.JTextArea();
        jLabel80 = new javax.swing.JLabel();
        buttonGuardarArchivoPaso1 = new javax.swing.JButton();
        buttonMostrarAdicionBits = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        representacionBinMasRelleno = new javax.swing.JTextArea();
        jLabel67 = new javax.swing.JLabel();
        buttonValidarAdicionBits1 = new javax.swing.JButton();
        panelPaso2 = new javax.swing.JPanel();
        jLabel32 = new javax.swing.JLabel();
        botonSiguientePaso2AE = new javax.swing.JButton();
        botonValidarMensajeConLongitud = new javax.swing.JButton();
        botonMostrarMensajeConLongitud = new javax.swing.JButton();
        jLabel68 = new javax.swing.JLabel();
        jScrollPane6 = new javax.swing.JScrollPane();
        representacionBinariaMasLongitud = new javax.swing.JTextArea();
        buttonGuardarArchivoPaso2 = new javax.swing.JButton();
        panelPaso3 = new javax.swing.JPanel();
        jLabel14 = new javax.swing.JLabel();
        botonSiguientePaso3AE = new javax.swing.JButton();
        jLabel13 = new javax.swing.JLabel();
        jLabel16 = new javax.swing.JLabel();
        jLabel17 = new javax.swing.JLabel();
        jLabel18 = new javax.swing.JLabel();
        jLabel19 = new javax.swing.JLabel();
        valorInicialA = new javax.swing.JTextField();
        valorInicialD = new javax.swing.JTextField();
        valorInicialC = new javax.swing.JTextField();
        valorInicialB = new javax.swing.JTextField();
        botonValidarVariablesConcat = new javax.swing.JButton();
        botonMostrarVariablesConcat = new javax.swing.JButton();
        buttonGuardarArchivoPaso3 = new javax.swing.JButton();
        panelPaso4 = new javax.swing.JPanel();
        jLabel26 = new javax.swing.JLabel();
        sumaFinal = new javax.swing.JLabel();
        botonSiguientePaso4AE = new javax.swing.JButton();
        botonMostrarGrillaCompleta = new javax.swing.JButton();
        jButton16 = new javax.swing.JButton();
        jLabel37 = new javax.swing.JLabel();
        jLabel40 = new javax.swing.JLabel();
        jLabel45 = new javax.swing.JLabel();
        jLabel46 = new javax.swing.JLabel();
        jLabel47 = new javax.swing.JLabel();
        jLabel48 = new javax.swing.JLabel();
        jLabel49 = new javax.swing.JLabel();
        jLabel50 = new javax.swing.JLabel();
        jLabel51 = new javax.swing.JLabel();
        jLabel52 = new javax.swing.JLabel();
        jLabel53 = new javax.swing.JLabel();
        jLabel54 = new javax.swing.JLabel();
        jLabel55 = new javax.swing.JLabel();
        jLabel56 = new javax.swing.JLabel();
        jLabel57 = new javax.swing.JLabel();
        jLabel58 = new javax.swing.JLabel();
        jLabel59 = new javax.swing.JLabel();
        jScrollPane4 = new javax.swing.JScrollPane();
        tablaPaso4 = new javax.swing.JTable();
        jLabel60 = new javax.swing.JLabel();
        botonCompletarGrilla = new javax.swing.JButton();
        buttonGuardarArchivoPaso4 = new javax.swing.JButton();
        panelPaso5 = new javax.swing.JPanel();
        jLabel25 = new javax.swing.JLabel();
        hashSalida = new javax.swing.JLabel();
        jLabel38 = new javax.swing.JLabel();
        valorResumen = new javax.swing.JTextField();
        botonValidarPaso5 = new javax.swing.JButton();
        jLabel39 = new javax.swing.JLabel();
        jLabel41 = new javax.swing.JLabel();
        botonMostrarPaso5 = new javax.swing.JButton();
        jLabel42 = new javax.swing.JLabel();
        jScrollPane5 = new javax.swing.JScrollPane();
        tablaPaso5 = new javax.swing.JTable();
        jLabel43 = new javax.swing.JLabel();
        jLabel44 = new javax.swing.JLabel();
        buttonGuardarArchivoPaso5 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();

        setPreferredSize(new java.awt.Dimension(1024, 1000));
        setLayout(null);

        jTabbedPane1.setFocusable(false);
        jTabbedPane1.setPreferredSize(new java.awt.Dimension(846, 519));

        IntroMD5.setMinimumSize(new java.awt.Dimension(0, 0));
        IntroMD5.setPreferredSize(new java.awt.Dimension(80, 379));
        IntroMD5.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        botContinuarPreguntas.setText("Continuar");
        botContinuarPreguntas.setEnabled(false);
        botContinuarPreguntas.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botContinuarPreguntasActionPerformed(evt);
            }
        });
        IntroMD5.add(botContinuarPreguntas, new org.netbeans.lib.awtextra.AbsoluteConstraints(670, 430, 100, 30));

        grupoPreg1.add(rbcorrecto1);
        rbcorrecto1.setText("Hash");
        IntroMD5.add(rbcorrecto1, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 90, -1, -1));

        grupoPreg1.add(rbincorrecto12);
        rbincorrecto12.setText("Asimétrica");
        IntroMD5.add(rbincorrecto12, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 70, -1, -1));

        grupoPreg1.add(rbincorrecto13);
        rbincorrecto13.setText("Simétrica");
        rbincorrecto13.setName(""); // NOI18N
        IntroMD5.add(rbincorrecto13, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 50, -1, -1));

        jLabel31.setText("<html><ul><li>MD5 es un algoritmo de encriptación:</li></ul></html>");
        IntroMD5.add(jLabel31, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 20, 310, 30));

        grupoPreg2.add(rbcorrecto2);
        rbcorrecto2.setText("No le importa la codificación porque trabaja a nivel binario");
        IntroMD5.add(rbcorrecto2, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 350, -1, -1));

        grupoPreg2.add(rbincorrecto2);
        rbincorrecto2.setText("Unicode UTF-8");
        IntroMD5.add(rbincorrecto2, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 310, -1, -1));

        grupoPreg2.add(rbincorrecto3);
        rbincorrecto3.setText("ASCII");
        rbincorrecto3.setName(""); // NOI18N
        IntroMD5.add(rbincorrecto3, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 330, -1, -1));

        jLabel33.setText("<html><ul><li>MD5 interpreta el mensaje como:</li></ul></html>");
        IntroMD5.add(jLabel33, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 270, -1, -1));

        grupoPreg3.add(rbincorrecto32);
        rbincorrecto32.setText("16");
        IntroMD5.add(rbincorrecto32, new org.netbeans.lib.awtextra.AbsoluteConstraints(670, 150, -1, -1));

        grupoPreg3.add(rbcorrecto3);
        rbcorrecto3.setText("4");
        IntroMD5.add(rbcorrecto3, new org.netbeans.lib.awtextra.AbsoluteConstraints(670, 130, -1, -1));

        grupoPreg3.add(rbincorrecto31);
        rbincorrecto31.setText("1");
        rbincorrecto31.setName(""); // NOI18N
        IntroMD5.add(rbincorrecto31, new org.netbeans.lib.awtextra.AbsoluteConstraints(670, 110, -1, -1));

        jLabel34.setText("<html><ul><li>¿ Cuántas rondas son necesarias para procesar un bloque del mensaje ?</li></ul></html>");
        IntroMD5.add(jLabel34, new org.netbeans.lib.awtextra.AbsoluteConstraints(580, 60, -1, -1));

        jLabel35.setText("<html><ul><li>¿ Cuántas operaciones por ronda son necesarias para procesar un bloque del mensaje ?</li></ul></html>");
        IntroMD5.add(jLabel35, new org.netbeans.lib.awtextra.AbsoluteConstraints(590, 230, 510, 60));

        grupoPreg4.add(rbincorrecto42);
        rbincorrecto42.setText("1");
        rbincorrecto42.setName(""); // NOI18N
        IntroMD5.add(rbincorrecto42, new org.netbeans.lib.awtextra.AbsoluteConstraints(680, 290, -1, -1));

        grupoPreg4.add(rbincorrecto41);
        rbincorrecto41.setText("4");
        IntroMD5.add(rbincorrecto41, new org.netbeans.lib.awtextra.AbsoluteConstraints(680, 310, -1, -1));

        grupoPreg4.add(rbcorrecto4);
        rbcorrecto4.setText("16");
        IntroMD5.add(rbcorrecto4, new org.netbeans.lib.awtextra.AbsoluteConstraints(680, 330, -1, -1));

        botCorregirPreguntas.setText("Corregir");
        botCorregirPreguntas.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                botCorregirPreguntasMousePressed(evt);
            }
        });
        IntroMD5.add(botCorregirPreguntas, new org.netbeans.lib.awtextra.AbsoluteConstraints(292, 430, 110, 30));

        botReintentarPreguntas.setText("Reintentar");
        botReintentarPreguntas.setEnabled(false);
        botReintentarPreguntas.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                botReintentarPreguntasMousePressed(evt);
            }
        });
        IntroMD5.add(botReintentarPreguntas, new org.netbeans.lib.awtextra.AbsoluteConstraints(540, 430, 110, 30));

        botResolverPreguntas.setText("Resolver");
        botResolverPreguntas.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                botResolverPreguntasMousePressed(evt);
            }
        });
        IntroMD5.add(botResolverPreguntas, new org.netbeans.lib.awtextra.AbsoluteConstraints(420, 430, 110, 30));

        jLabel36.setText("<html><ul><li>¿ Cuál es el contenido inicial de las variables de concatenación A, B, C y D?</li></ul></html>");
        IntroMD5.add(jLabel36, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 140, 480, 30));

        grupoPreg5.add(rbincorrecto14);
        rbincorrecto14.setText("A=12345678; B=90123456; C=78901234; D=56789012");
        rbincorrecto14.setName(""); // NOI18N
        IntroMD5.add(rbincorrecto14, new org.netbeans.lib.awtextra.AbsoluteConstraints(80, 180, -1, -1));

        grupoPreg5.add(rbcorrecto5);
        rbcorrecto5.setText("A=67452301; B=EFCDAB89; C=98BADCFE; D=10325476");
        IntroMD5.add(rbcorrecto5, new org.netbeans.lib.awtextra.AbsoluteConstraints(80, 200, -1, -1));

        grupoPreg5.add(rbincorrecto15);
        rbincorrecto15.setText("Se inicializan todas en 0");
        IntroMD5.add(rbincorrecto15, new org.netbeans.lib.awtextra.AbsoluteConstraints(80, 220, -1, -1));

        jTabbedPane1.addTab("Introducción", IntroMD5);

        panelPaso1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        lblHeaderPaso3.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        lblHeaderPaso3.setText("Paso 1: Adición de bits");
        panelPaso1.add(lblHeaderPaso3, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 10, -1, -1));

        botonSiguientePaso1AE.setText("Siguiente");
        botonSiguientePaso1AE.setEnabled(false);
        botonSiguientePaso1AE.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                botonSiguientePaso1AEMousePressed(evt);
            }
        });
        panelPaso1.add(botonSiguientePaso1AE, new org.netbeans.lib.awtextra.AbsoluteConstraints(810, 460, 110, 30));

        jLabel2.setText("<html> Trabajaremos con un mensaje menor a 512 caracteres. Si el mensaje fuera más largo, el algoritmo parte el mensaje en bloques de 512 y trabaja por bloques</html>");
        panelPaso1.add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 50, 1000, 40));

        mensajeAEncriptar.setText("TOP SECRET MESSAGE");
        mensajeAEncriptar.setToolTipText("");
        panelPaso1.add(mensajeAEncriptar, new org.netbeans.lib.awtextra.AbsoluteConstraints(400, 130, 220, -1));

        jLabel66.setText("<html>Introduzca aquí el relleno del mensaje para que el bloque sea 448 mod 512, sin espacios ni saltos de línea:</html>");
        panelPaso1.add(jLabel66, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 340, 320, 60));

        jScrollPane1.setToolTipText("Relleno");

        representacionBinaria.setColumns(20);
        representacionBinaria.setLineWrap(true);
        representacionBinaria.setRows(5);
        jScrollPane1.setViewportView(representacionBinaria);

        panelPaso1.add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(400, 200, 600, 110));

        jLabel80.setText("Introduzca un mensaje:");
        panelPaso1.add(jLabel80, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 130, -1, -1));

        buttonGuardarArchivoPaso1.setText("Guardar");
        buttonGuardarArchivoPaso1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonGuardarArchivoPaso1ActionPerformed(evt);
            }
        });
        panelPaso1.add(buttonGuardarArchivoPaso1, new org.netbeans.lib.awtextra.AbsoluteConstraints(390, 460, 100, 30));

        buttonMostrarAdicionBits.setText("Mostrar");
        buttonMostrarAdicionBits.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonMostrarAdicionBitsActionPerformed(evt);
            }
        });
        panelPaso1.add(buttonMostrarAdicionBits, new org.netbeans.lib.awtextra.AbsoluteConstraints(530, 460, 100, 30));

        representacionBinMasRelleno.setColumns(20);
        representacionBinMasRelleno.setLineWrap(true);
        representacionBinMasRelleno.setRows(5);
        representacionBinMasRelleno.setToolTipText("Longitud en binario");
        jScrollPane2.setViewportView(representacionBinMasRelleno);

        panelPaso1.add(jScrollPane2, new org.netbeans.lib.awtextra.AbsoluteConstraints(400, 330, 600, 100));

        jLabel67.setText("<html>Introduzca aquí el mensaje en representación binaria, sin espacios ni saltos de línea:</html>");
        panelPaso1.add(jLabel67, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 200, 350, 40));

        buttonValidarAdicionBits1.setText("Validar");
        buttonValidarAdicionBits1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonValidarAdicionBits1ActionPerformed(evt);
            }
        });
        panelPaso1.add(buttonValidarAdicionBits1, new org.netbeans.lib.awtextra.AbsoluteConstraints(670, 460, 100, 30));

        jTabbedPane1.addTab("Paso 1 de 5", panelPaso1);

        panelPaso2.setLayout(null);

        jLabel32.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel32.setText("Paso 2: Adición de longitud del mensaje");
        panelPaso2.add(jLabel32);
        jLabel32.setBounds(21, 12, 440, 22);

        botonSiguientePaso2AE.setText("Siguiente");
        botonSiguientePaso2AE.setEnabled(false);
        botonSiguientePaso2AE.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                botonSiguientePaso2AEMousePressed(evt);
            }
        });
        panelPaso2.add(botonSiguientePaso2AE);
        botonSiguientePaso2AE.setBounds(700, 440, 110, 30);

        botonValidarMensajeConLongitud.setText("Validar");
        botonValidarMensajeConLongitud.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonValidarMensajeConLongitudActionPerformed(evt);
            }
        });
        panelPaso2.add(botonValidarMensajeConLongitud);
        botonValidarMensajeConLongitud.setBounds(570, 440, 110, 30);

        botonMostrarMensajeConLongitud.setText("Mostrar");
        botonMostrarMensajeConLongitud.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonMostrarMensajeConLongitudActionPerformed(evt);
            }
        });
        panelPaso2.add(botonMostrarMensajeConLongitud);
        botonMostrarMensajeConLongitud.setBounds(430, 440, 110, 30);

        jLabel68.setText("<html>Introduzca aqui el valor obtenido en el paso anterior concatenado a la longitud del mensaje (en su representación binaria):</html>");
        panelPaso2.add(jLabel68);
        jLabel68.setBounds(30, 170, 320, 90);

        jScrollPane6.setToolTipText("Relleno");

        representacionBinariaMasLongitud.setColumns(20);
        representacionBinariaMasLongitud.setLineWrap(true);
        representacionBinariaMasLongitud.setRows(5);
        jScrollPane6.setViewportView(representacionBinariaMasLongitud);

        panelPaso2.add(jScrollPane6);
        jScrollPane6.setBounds(370, 170, 610, 140);

        buttonGuardarArchivoPaso2.setText("Guardar");
        buttonGuardarArchivoPaso2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonGuardarArchivoPaso2ActionPerformed(evt);
            }
        });
        panelPaso2.add(buttonGuardarArchivoPaso2);
        buttonGuardarArchivoPaso2.setBounds(310, 440, 100, 30);

        jTabbedPane1.addTab("Paso 2 de 5", panelPaso2);

        panelPaso3.setPreferredSize(new java.awt.Dimension(640, 860));
        panelPaso3.setLayout(null);

        jLabel14.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel14.setText("Paso 3: Inicialización del búffer");
        panelPaso3.add(jLabel14);
        jLabel14.setBounds(20, 10, 350, 22);

        botonSiguientePaso3AE.setText("Siguiente");
        botonSiguientePaso3AE.setEnabled(false);
        botonSiguientePaso3AE.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonSiguientePaso3AEActionPerformed(evt);
            }
        });
        panelPaso3.add(botonSiguientePaso3AE);
        botonSiguientePaso3AE.setBounds(700, 440, 110, 30);

        jLabel13.setText("<html>Ingrese el contenido inicial de las variables de concatenación (a, b, c y d) en hexadecimal. Escríbalas en formato litte-endian:</html>");
        panelPaso3.add(jLabel13);
        jLabel13.setBounds(20, 50, 930, 70);

        jLabel16.setText("A: ");
        panelPaso3.add(jLabel16);
        jLabel16.setBounds(220, 150, 16, 15);

        jLabel17.setText("B:");
        panelPaso3.add(jLabel17);
        jLabel17.setBounds(220, 190, 34, 15);

        jLabel18.setText("C:");
        panelPaso3.add(jLabel18);
        jLabel18.setBounds(220, 230, 34, 15);

        jLabel19.setText("D:");
        panelPaso3.add(jLabel19);
        jLabel19.setBounds(220, 270, 34, 15);
        panelPaso3.add(valorInicialA);
        valorInicialA.setBounds(270, 140, 220, 30);
        panelPaso3.add(valorInicialD);
        valorInicialD.setBounds(270, 260, 220, 30);
        panelPaso3.add(valorInicialC);
        valorInicialC.setBounds(270, 220, 220, 30);
        panelPaso3.add(valorInicialB);
        valorInicialB.setBounds(270, 180, 220, 30);

        botonValidarVariablesConcat.setText("Validar");
        botonValidarVariablesConcat.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonValidarVariablesConcatActionPerformed(evt);
            }
        });
        panelPaso3.add(botonValidarVariablesConcat);
        botonValidarVariablesConcat.setBounds(570, 440, 110, 30);

        botonMostrarVariablesConcat.setText("Mostrar");
        botonMostrarVariablesConcat.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonMostrarVariablesConcatActionPerformed(evt);
            }
        });
        panelPaso3.add(botonMostrarVariablesConcat);
        botonMostrarVariablesConcat.setBounds(430, 440, 110, 30);

        buttonGuardarArchivoPaso3.setText("Guardar");
        buttonGuardarArchivoPaso3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonGuardarArchivoPaso3ActionPerformed(evt);
            }
        });
        panelPaso3.add(buttonGuardarArchivoPaso3);
        buttonGuardarArchivoPaso3.setBounds(290, 440, 120, 30);

        jTabbedPane1.addTab("Paso 3 de 5", panelPaso3);

        panelPaso4.setLayout(null);

        jLabel26.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel26.setText("Paso 4: Procesamiento del mensaje");
        panelPaso4.add(jLabel26);
        jLabel26.setBounds(20, 10, 390, 22);
        panelPaso4.add(sumaFinal);
        sumaFinal.setBounds(660, 500, 440, 20);

        botonSiguientePaso4AE.setText("Siguiente");
        botonSiguientePaso4AE.setEnabled(false);
        botonSiguientePaso4AE.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonSiguientePaso4AEActionPerformed(evt);
            }
        });
        panelPaso4.add(botonSiguientePaso4AE);
        botonSiguientePaso4AE.setBounds(610, 510, 110, 30);

        botonMostrarGrillaCompleta.setText("Mostrar");
        botonMostrarGrillaCompleta.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonMostrarGrillaCompletaActionPerformed(evt);
            }
        });
        panelPaso4.add(botonMostrarGrillaCompleta);
        botonMostrarGrillaCompleta.setBounds(160, 510, 110, 30);

        jButton16.setText("Validar");
        jButton16.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                onValidarGrilla(evt);
            }
        });
        panelPaso4.add(jButton16);
        jButton16.setBounds(460, 510, 110, 30);

        jLabel37.setText("1");
        panelPaso4.add(jLabel37);
        jLabel37.setBounds(470, 140, 52, 10);

        jLabel40.setText("<html>Ingrese los valores que van tomando las variables de concatenación durante el procesamiento del mensaje, para validar su contenido:</html>");
        panelPaso4.add(jLabel40);
        jLabel40.setBounds(40, 130, 310, 70);

        jLabel45.setText("1");
        panelPaso4.add(jLabel45);
        jLabel45.setBounds(470, 200, 52, 10);

        jLabel46.setText("1");
        panelPaso4.add(jLabel46);
        jLabel46.setBounds(470, 160, 52, 10);

        jLabel47.setText("2");
        panelPaso4.add(jLabel47);
        jLabel47.setBounds(470, 220, 52, 10);

        jLabel48.setText("2");
        panelPaso4.add(jLabel48);
        jLabel48.setBounds(470, 240, 52, 15);

        jLabel49.setText("2");
        panelPaso4.add(jLabel49);
        jLabel49.setBounds(470, 260, 52, 15);

        jLabel50.setText("2");
        panelPaso4.add(jLabel50);
        jLabel50.setBounds(470, 280, 52, 20);

        jLabel51.setText("3");
        panelPaso4.add(jLabel51);
        jLabel51.setBounds(470, 300, 52, 20);

        jLabel52.setText("3");
        panelPaso4.add(jLabel52);
        jLabel52.setBounds(470, 320, 52, 20);

        jLabel53.setText("3");
        panelPaso4.add(jLabel53);
        jLabel53.setBounds(470, 340, 52, 20);

        jLabel54.setText("3");
        panelPaso4.add(jLabel54);
        jLabel54.setBounds(470, 370, 52, 10);

        jLabel55.setText("4");
        panelPaso4.add(jLabel55);
        jLabel55.setBounds(470, 390, 52, 10);

        jLabel56.setText("4");
        panelPaso4.add(jLabel56);
        jLabel56.setBounds(470, 410, 52, 10);

        jLabel57.setText("4");
        panelPaso4.add(jLabel57);
        jLabel57.setBounds(470, 430, 52, 10);

        jLabel58.setText("4");
        panelPaso4.add(jLabel58);
        jLabel58.setBounds(470, 450, 52, 10);

        jLabel59.setText("1");
        panelPaso4.add(jLabel59);
        jLabel59.setBounds(470, 180, 52, 10);

        tablaPaso4.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null}
            },
            new String [] {
                "Ronda", "A", "D", "C", "B"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, true, true, true, true
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaPaso4.setCellEditor(myCellEditor);
        tablaPaso4.setColumnSelectionAllowed(true);
        tablaPaso4.setRowHeight(21);
        tablaPaso4.getTableHeader().setReorderingAllowed(false);
        tablaPaso4.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                onGrillaMouseClick(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                onGrillaMouseExited(evt);
            }
            public void mousePressed(java.awt.event.MouseEvent evt) {
                onGrillaMousePressed(evt);
            }
        });
        tablaPaso4.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                onGrillaMouseDragged(evt);
            }
        });
        jScrollPane4.setViewportView(tablaPaso4);
        tablaPaso4.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION);

        panelPaso4.add(jScrollPane4);
        jScrollPane4.setBounds(420, 110, 580, 370);

        jLabel60.setText("La base del algoritmo es una función de compresión que consta de cuatro rondas de estructura similar.");
        panelPaso4.add(jLabel60);
        jLabel60.setBounds(20, 40, 720, 15);

        botonCompletarGrilla.setText("Completar grilla");
        botonCompletarGrilla.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCompletarGrillaActionPerformed(evt);
            }
        });
        panelPaso4.add(botonCompletarGrilla);
        botonCompletarGrilla.setBounds(290, 510, 140, 30);

        buttonGuardarArchivoPaso4.setText("Guardar");
        buttonGuardarArchivoPaso4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonGuardarArchivoPaso4ActionPerformed(evt);
            }
        });
        panelPaso4.add(buttonGuardarArchivoPaso4);
        buttonGuardarArchivoPaso4.setBounds(40, 510, 100, 30);

        jTabbedPane1.addTab("Paso 4 de 5", panelPaso4);

        panelPaso5.setLayout(null);

        jLabel25.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel25.setText("Paso 5: Obtención del hash de salida (message digest o resumen del mensaje)");
        panelPaso5.add(jLabel25);
        jLabel25.setBounds(12, 12, 900, 22);
        panelPaso5.add(hashSalida);
        hashSalida.setBounds(270, 310, 0, 0);

        jLabel38.setText("Ingrese los valores ya calculados en los pasos 3 y 4 y realice la suma para obtener el resumen del mensaje:");
        panelPaso5.add(jLabel38);
        jLabel38.setBounds(20, 80, 810, 15);
        panelPaso5.add(valorResumen);
        valorResumen.setBounds(400, 330, 440, 30);

        botonValidarPaso5.setText("Validar");
        botonValidarPaso5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonValidarPaso5ActionPerformed(evt);
            }
        });
        panelPaso5.add(botonValidarPaso5);
        botonValidarPaso5.setBounds(570, 440, 110, 30);

        jLabel39.setText("Variables iniciales");
        panelPaso5.add(jLabel39);
        jLabel39.setBounds(220, 160, 140, 20);

        jLabel41.setText("Variables salida");
        panelPaso5.add(jLabel41);
        jLabel41.setBounds(220, 180, 140, 15);

        botonMostrarPaso5.setText("Mostrar");
        botonMostrarPaso5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonMostrarPaso5ActionPerformed(evt);
            }
        });
        panelPaso5.add(botonMostrarPaso5);
        botonMostrarPaso5.setBounds(430, 440, 110, 30);

        jLabel42.setText("Suma final");
        panelPaso5.add(jLabel42);
        jLabel42.setBounds(220, 200, 140, 15);

        tablaPaso5.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "A", "D", "C", "B"
            }
        ));
        tablaPaso5.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tablaPaso5MouseClicked(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                tablaPaso5MouseExited(evt);
            }
            public void mousePressed(java.awt.event.MouseEvent evt) {
                tablaPaso5MousePressed(evt);
            }
        });
        tablaPaso5.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                tablaPaso5MouseDragged(evt);
            }
        });
        jScrollPane5.setViewportView(tablaPaso5);
        if (tablaPaso5.getColumnModel().getColumnCount() > 0) {
            tablaPaso5.getColumnModel().getColumn(0).setResizable(false);
            tablaPaso5.getColumnModel().getColumn(1).setResizable(false);
            tablaPaso5.getColumnModel().getColumn(2).setResizable(false);
            tablaPaso5.getColumnModel().getColumn(3).setResizable(false);
        }

        panelPaso5.add(jScrollPane5);
        jScrollPane5.setBounds(340, 140, 550, 80);

        jLabel43.setText("<html><b>Ingrese el resumen del mensaje en formato little - endian:</b></html>");
        panelPaso5.add(jLabel43);
        jLabel43.setBounds(350, 270, 460, 20);

        jLabel44.setText("Resumen MD5:");
        panelPaso5.add(jLabel44);
        jLabel44.setBounds(230, 340, 140, 15);

        buttonGuardarArchivoPaso5.setText("Guardar");
        buttonGuardarArchivoPaso5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonGuardarArchivoPaso5ActionPerformed(evt);
            }
        });
        panelPaso5.add(buttonGuardarArchivoPaso5);
        buttonGuardarArchivoPaso5.setBounds(300, 440, 100, 30);

        jTabbedPane1.addTab("Paso 5 de 5", panelPaso5);

        add(jTabbedPane1);
        jTabbedPane1.setBounds(20, 50, 1250, 600);

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel1.setText("MD5 - Modo Evaluar");
        add(jLabel1);
        jLabel1.setBounds(400, 10, 320, 22);

        getAccessibleContext().setAccessibleName("");
    }// </editor-fold>//GEN-END:initComponents

    private void botonMostrarPaso5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonMostrarPaso5ActionPerformed
        
            tablaPaso5.setValueAt(MD5.getMatrizValores()[0][0], 0, 0);
            tablaPaso5.setValueAt(MD5.getMatrizValores()[3][0], 0, 1);
            tablaPaso5.setValueAt(MD5.getMatrizValores()[2][0], 0, 2);
            tablaPaso5.setValueAt(MD5.getMatrizValores()[1][0], 0, 3);
            tablaPaso5.setValueAt(MD5.getMatrizValores()[0][16], 1, 0);
            tablaPaso5.setValueAt(MD5.getMatrizValores()[3][16], 1, 1);
            tablaPaso5.setValueAt(MD5.getMatrizValores()[2][16], 1, 2);
            tablaPaso5.setValueAt(MD5.getMatrizValores()[1][16], 1, 3);
            tablaPaso5.setValueAt(MD5.getMatrizValores()[0][17], 2, 0);
            tablaPaso5.setValueAt(MD5.getMatrizValores()[3][17], 2, 1);
            tablaPaso5.setValueAt(MD5.getMatrizValores()[2][17], 2, 2);
            tablaPaso5.setValueAt(MD5.getMatrizValores()[1][17], 2, 3);
            valorResumen.setText("" + MD5.ejecutarMd5(mensajeAEncriptar.getText()));
            buttonGuardarArchivoPaso5.setEnabled(true);
    }//GEN-LAST:event_botonMostrarPaso5ActionPerformed

    private void botonMostrarGrillaCompletaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonMostrarGrillaCompletaActionPerformed
            seteoInicial();
            completarGrilla(limitei, limitej, true);
            botonSiguientePaso4AE.setEnabled(true);
            buttonGuardarArchivoPaso4.setEnabled(true);
    }//GEN-LAST:event_botonMostrarGrillaCompletaActionPerformed
    
    private void seteoInicial() throws NumberFormatException {
            for (int j = 0; j < 16; j++) {
                for (int i = 1; i < 5; i++) {
                    tablaPaso4.setValueAt("", j, i);     
                }
            }
        limitei = 4; limitej = 16;
        iteracionRonda1 = 0;
        iteracionRonda2 = 0;
        iteracionRonda3 = 0;
        iteracionRonda4 = 0;
        ianterior = 0;
        janterior = 0;        
    }

     private void completarGrilla(int limiteColumna, int limiteFila, boolean completamente) {
        int count = 0;
        while (janterior < 16) {
            while (ianterior < 4) {
                if (completamente || (tablaPaso4.getValueAt(janterior, ianterior+1) == null || tablaPaso4.getValueAt(janterior, ianterior+1).equals("")))
                    tablaPaso4.setValueAt(MD5.getMatrizValores()[ianterior][janterior+1], janterior, ianterior+1);
                    count++;
                    ianterior++;
                    if (count >= limiteColumna*limiteFila){
                        break;
                    }
            }
            if (ianterior == 4){
                janterior++;
                ianterior=0;
            }
            if (count >= limiteColumna*limiteFila){
                break;
            }
        }      
    }
     
    private void botonSiguientePaso4AEActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonSiguientePaso4AEActionPerformed
        jTabbedPane1.setEnabledAt(5, true);
        jTabbedPane1.setSelectedIndex(5);
    }//GEN-LAST:event_botonSiguientePaso4AEActionPerformed

    private void botonMostrarVariablesConcatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonMostrarVariablesConcatActionPerformed
        valorInicialA.setText("01234567");
        valorInicialB.setText("89ABCDEF");
        valorInicialC.setText("FEDCBA98");
        valorInicialD.setText("76543210");   
        botonSiguientePaso3AE.setEnabled(true);
        buttonGuardarArchivoPaso3.setEnabled(true);
    }//GEN-LAST:event_botonMostrarVariablesConcatActionPerformed

    private void botonSiguientePaso3AEActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonSiguientePaso3AEActionPerformed
            char chrTestData[] = new char[64];
            chrTestData = mensajeAEncriptar.getText().toCharArray();
            md5.update(chrTestData, chrTestData.length);
            md5.md5final();
            
            jTabbedPane1.setEnabledAt(4, true);
            jTabbedPane1.setSelectedIndex(4);
    }//GEN-LAST:event_botonSiguientePaso3AEActionPerformed

    private void botonMostrarMensajeConLongitudActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonMostrarMensajeConLongitudActionPerformed
            String msgAEncriptar = mensajeAEncriptar.getText();
            String msgAprocesar = MD5.textoAProcesar(msgAEncriptar, msgAEncriptar.length(), true);
            representacionBinariaMasLongitud.setText(msgAprocesar);
            botonSiguientePaso2AE.setEnabled(true);      
            buttonGuardarArchivoPaso2.setEnabled(true);
    }//GEN-LAST:event_botonMostrarMensajeConLongitudActionPerformed

    private void botonSiguientePaso2AEMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_botonSiguientePaso2AEMousePressed
        jTabbedPane1.setEnabledAt(3, true);
        jTabbedPane1.setSelectedIndex(3);
    }//GEN-LAST:event_botonSiguientePaso2AEMousePressed

    private void buttonGuardarArchivoPaso1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonGuardarArchivoPaso1ActionPerformed
        saveFile(1);
    }//GEN-LAST:event_buttonGuardarArchivoPaso1ActionPerformed

    public void saveFile (int step) {
        try {
            JFileChooser saveFile = new JFileChooser();
            saveFile.showSaveDialog(null);
            String path=saveFile.getSelectedFile().getAbsolutePath();
            String filename=saveFile.getSelectedFile().getName();
            AlgorithmStateStorage.saveMD5(filename, path, this.messageToJson(step));
            JOptionPane.showMessageDialog(null, "El archivo se salvo correctamente");
        } catch (IOException ex) {
            Logger.getLogger(MD5PanelEvaluar.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Hubo un error al guardar el archivo");
        } catch (NullPointerException npe) {
            Logger.getLogger(MD5PanelEvaluar.class.getName()).log(Level.SEVERE, null, npe);
        }
    }
    
    public MD5DTO messageToJson(int step){
            MD5DTO md5DTO = new MD5DTO();
            md5DTO.setCurrentStep(step);
            md5DTO.setMessage(mensajeAEncriptar.getText());
            if (step >= 1) {
                md5DTO.setBinaryMessage(representacionBinaria.getText());
                md5DTO.setRepresentationBitsPlusFiller(representacionBinMasRelleno.getText());
            } 
            if (step >= 2){
                md5DTO.setRepresentationBitsPlusLong(representacionBinariaMasLongitud.getText());    
            } 
            if (step >= 3){
                md5DTO.setInitialValueA(valorInicialA.getText());
                md5DTO.setInitialValueB(valorInicialB.getText());
                md5DTO.setInitialValueC(valorInicialC.getText());
                md5DTO.setInitialValueD(valorInicialD.getText());
            }
            if (step >= 4){
                String [][] matrizActual = new String[16][4];
                for (int i = 0; i < 16; i++) {
                    for (int j = 1; j < 5; j++) {
                        matrizActual[i][j-1] = tablaPaso4.getValueAt(i, j).toString();
                    }
                }
                md5DTO.setMatrixStep4(matrizActual);
            }
            if (step >= 5) {
                md5DTO.setResumeValue(valorResumen.getText());
                String [][] matrizActualPaso5 = new String[3][4];
                for (int i = 0; i < 3; i++) {
                    for (int j = 0; j < 4; j++) {
                        matrizActualPaso5[i][j] = tablaPaso5.getValueAt(i, j).toString();
                    }
                }
                md5DTO.setMatrixStep5(matrizActualPaso5);
            }
            
            return md5DTO;
    }

    public boolean compararIgualdadTextos(String valor1, String valor2) {
        boolean sonIguales = false;
        valor1 = valor1.trim();
        valor2 = valor2.trim();
        if (valor1.equals(valor2)){
            sonIguales = true;
        }
        return sonIguales;
    }
    
    private void botonSiguientePaso1AEMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_botonSiguientePaso1AEMousePressed
        jTabbedPane1.setEnabledAt(2, true);
        jTabbedPane1.setSelectedIndex(2);
    }//GEN-LAST:event_botonSiguientePaso1AEMousePressed

    private void botResolverPreguntasMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_botResolverPreguntasMousePressed
        this.rbcorrecto1.setForeground(Color.green);
        this.rbcorrecto2.setForeground(Color.green);
        this.rbcorrecto3.setForeground(Color.green);
        this.rbcorrecto4.setForeground(Color.green);
        this.rbcorrecto5.setForeground(Color.green);
        this.botContinuarPreguntas.setEnabled(true);
        this.botCorregirPreguntas.setEnabled(false);
        this.botResolverPreguntas.setEnabled(false);
        this.botReintentarPreguntas.setEnabled(true);
        this.buttonGuardarArchivoPaso1.setEnabled(true);
    }//GEN-LAST:event_botResolverPreguntasMousePressed

    private void botReintentarPreguntasMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_botReintentarPreguntasMousePressed
        this.botReintentarPreguntas.setEnabled(false);
        this.botCorregirPreguntas.setEnabled(true);
        this.resetearPreguntas();
    }//GEN-LAST:event_botReintentarPreguntasMousePressed

    private void botCorregirPreguntasMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_botCorregirPreguntasMousePressed
        short correctas = 0;
        if(this.rbcorrecto1.isSelected()){
            correctas++;
            this.rbcorrecto1.setForeground(Color.green);
        }
        else this.rbcorrecto1.setForeground(Color.red);
        if(this.rbcorrecto2.isSelected()){
            correctas++;
            this.rbcorrecto2.setForeground(Color.green);
        }
        else this.rbcorrecto2.setForeground(Color.red);
        if(this.rbcorrecto3.isSelected()){
            correctas++;
            this.rbcorrecto3.setForeground(Color.green);
        }
        else this.rbcorrecto3.setForeground(Color.red);
        if(this.rbcorrecto4.isSelected()){
            correctas++;
            this.rbcorrecto4.setForeground(Color.green);
        }
        else this.rbcorrecto4.setForeground(Color.red);
         if(this.rbcorrecto5.isSelected()){
            correctas++;
            this.rbcorrecto5.setForeground(Color.green);
        }
        else this.rbcorrecto5.setForeground(Color.red);
        JOptionPane.showMessageDialog(null, "Correctas: " + correctas + "/5");

        this.botCorregirPreguntas.setEnabled(false);
        this.botReintentarPreguntas.setEnabled(true);
        this.botContinuarPreguntas.setEnabled(true);
    }//GEN-LAST:event_botCorregirPreguntasMousePressed

    private void botContinuarPreguntasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botContinuarPreguntasActionPerformed
        jTabbedPane1.setEnabledAt(1, true);
        jTabbedPane1.setSelectedIndex(1);
    }//GEN-LAST:event_botContinuarPreguntasActionPerformed

    private void buttonMostrarAdicionBitsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonMostrarAdicionBitsActionPerformed
        String msgAEncriptar = mensajeAEncriptar.getText();

        if (!msgAEncriptar.equals("")) {
                String msgBinario = MD5.textoEnBinario(msgAEncriptar, true);
                representacionBinaria.setText(msgBinario);
                String msgPadeado = MD5.textoPadeado(msgAEncriptar, msgAEncriptar.length(), true);
                representacionBinMasRelleno.setText(msgPadeado);
                botonSiguientePaso1AE.setEnabled(true);
                buttonGuardarArchivoPaso1.setEnabled(true);
        } else {
                JOptionPane.showMessageDialog(IntroMD5, "Debe ingresar un texto a encriptar!", "MD5", JOptionPane.ERROR_MESSAGE);
        }         
    }//GEN-LAST:event_buttonMostrarAdicionBitsActionPerformed

    private void botonValidarMensajeConLongitudActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonValidarMensajeConLongitudActionPerformed
        String msgAEncriptar = mensajeAEncriptar.getText();

        String msgAProcesar = MD5.textoAProcesar(msgAEncriptar, msgAEncriptar.length(), true);
        if (compararIgualdadTextos(msgAProcesar, representacionBinariaMasLongitud.getText())) {
                botonSiguientePaso2AE.setEnabled(true);
                buttonGuardarArchivoPaso2.setEnabled(true);
                JOptionPane.showMessageDialog(IntroMD5, "El mensaje a procesar es correcto!", "MD5", JOptionPane.INFORMATION_MESSAGE);
        } else {
                JOptionPane.showMessageDialog(IntroMD5, "El mensaje a procesar es invalido!", "MD5", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_botonValidarMensajeConLongitudActionPerformed

    private void botonValidarVariablesConcatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonValidarVariablesConcatActionPerformed
        boolean valorA = compararIgualdadTextos(valorInicialA.getText(), "01234567");
        boolean valorB = compararIgualdadTextos(valorInicialB.getText(), "89ABCDEF");
        boolean valorC = compararIgualdadTextos(valorInicialC.getText(), "FEDCBA98");
        boolean valorD = compararIgualdadTextos(valorInicialD.getText(), "76543210");
        
        if (valorA && valorB && valorC && valorD) {
                botonSiguientePaso3AE.setEnabled(true); 
                buttonGuardarArchivoPaso3.setEnabled(true);
                JOptionPane.showMessageDialog(IntroMD5, "Los valores de concatenación ingresados son correctos!", "MD5", JOptionPane.INFORMATION_MESSAGE);
        } else {
                JOptionPane.showMessageDialog(IntroMD5, "Uno o más de los valores de concatenación ingresados son invalidos!", "MD5", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_botonValidarVariablesConcatActionPerformed

    private void onGrillaMouseClick(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_onGrillaMouseClick
         tablaPaso4.updateUI();
         handleGrillaEvents(evt);
    }//GEN-LAST:event_onGrillaMouseClick

    private void onGrillaMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_onGrillaMouseExited
                  tablaPaso4.updateUI(); 
    }//GEN-LAST:event_onGrillaMouseExited

    private void onGrillaMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_onGrillaMousePressed
        handleGrillaEvents(evt);
    }//GEN-LAST:event_onGrillaMousePressed

    private void onGrillaMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_onGrillaMouseDragged
         tablaPaso4.updateUI(); 
    }//GEN-LAST:event_onGrillaMouseDragged

    private void onValidarGrilla(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_onValidarGrilla
        
        String[][] auxMatrix = new String[16][4];
        for(int i=0;i<auxMatrix.length;i++){
            auxMatrix[i] = new String[4];
        }
             
        int janteriorLocal =0;
        int ianteriorLocal =0;
        while (janteriorLocal < 16) {
            while (ianteriorLocal < 4){                
                auxMatrix[janteriorLocal][ianteriorLocal]=MD5.getMatrizValores()[ianteriorLocal][janteriorLocal+1];
            
                ianteriorLocal++;                
            }
            if (ianteriorLocal == 4){
                janteriorLocal++;
                ianteriorLocal=0;
            }            
        }      
        /*********************************************************************/
        
        String currentValue = null;
        Object userInput = null;
        int countErrores = 0;
        for(int i=0;i<16;i++){
            for(int j=0;j<4;j++){               
                currentValue = auxMatrix[i][j];
                userInput = MyCellEditor.cleanText((String) tablaPaso4.getValueAt(i, j+1));
                if(userInput!=null && !userInput.toString().isEmpty()){
                    if(compararIgualdadTextos(currentValue, userInput.toString())){
                        tablaPaso4.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", i, j+1);
                    }else{//no son iguales
                         countErrores++;
                        tablaPaso4.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", i, j+1);
                    }
                }
            }//end for j
        } //end for i
        if(countErrores>0){
            JOptionPane.showMessageDialog(panelPaso4, "Usted tiene "+countErrores+" errores en la grilla", "Error", JOptionPane.ERROR_MESSAGE);
        }else{
            JOptionPane.showMessageDialog(panelPaso4, "Todos los valores ingresados son correctos", "MD5", JOptionPane.INFORMATION_MESSAGE);
        }
    }//GEN-LAST:event_onValidarGrilla

    private void botonValidarPaso5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonValidarPaso5ActionPerformed
        
        int countErrores = 0;
        
        String currentValue = MD5.getMatrizValores()[0][0]; 
        Object userInput = MyCellEditor.cleanText((String) tablaPaso5.getValueAt(0,0));
        if (compararIgualdadTextos(currentValue, (String)userInput)){
            tablaPaso5.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", 0, 0);
        } else {//no son iguales
            tablaPaso5.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", 0, 0);
            countErrores++;
        }
        currentValue = MD5.getMatrizValores()[3][0]; 
        userInput = MyCellEditor.cleanText((String) tablaPaso5.getValueAt(0,1));
        if (compararIgualdadTextos(currentValue, (String)userInput)){
            tablaPaso5.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", 0, 1);
        } else {//no son iguales
            tablaPaso5.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", 0, 1);
            countErrores++;
        }
        currentValue = MD5.getMatrizValores()[2][0]; 
        userInput = MyCellEditor.cleanText((String) tablaPaso5.getValueAt(0,2));
        if (compararIgualdadTextos(currentValue, (String)userInput)){
            tablaPaso5.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", 0, 2);
        } else {//no son iguales
            tablaPaso5.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", 0, 2);            
            countErrores++;
        }
        currentValue = MD5.getMatrizValores()[1][0]; 
        userInput = MyCellEditor.cleanText((String) tablaPaso5.getValueAt(0,3));
        if (compararIgualdadTextos(currentValue, (String)userInput)){
            tablaPaso5.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", 0, 3);
        } else {//no son iguales
            tablaPaso5.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", 0, 3);
            countErrores++;
        }
        currentValue = MD5.getMatrizValores()[0][16]; 
        userInput = MyCellEditor.cleanText((String) tablaPaso5.getValueAt(1,0));
        if (compararIgualdadTextos(currentValue, (String)userInput)){
            tablaPaso5.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", 1, 0);
        } else {//no son iguales
            tablaPaso5.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", 1, 0);
            countErrores++;
        }
        currentValue = MD5.getMatrizValores()[3][16]; 
        userInput = MyCellEditor.cleanText((String) tablaPaso5.getValueAt(1,1));
        if (compararIgualdadTextos(currentValue, (String)userInput)){
            tablaPaso5.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", 1, 1);
        } else {//no son iguales
            tablaPaso5.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", 1, 1);
            countErrores++;
        }
        currentValue = MD5.getMatrizValores()[2][16]; 
        userInput = MyCellEditor.cleanText((String) tablaPaso5.getValueAt(1,2));
        if (compararIgualdadTextos(currentValue, (String)userInput)){
            tablaPaso5.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", 1, 2);
        } else {//no son iguales
            tablaPaso5.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", 1, 2);            
            countErrores++;
        }
        currentValue = MD5.getMatrizValores()[1][16]; 
        userInput = MyCellEditor.cleanText((String) tablaPaso5.getValueAt(1,3));
        if (compararIgualdadTextos(currentValue, (String)userInput)){
            tablaPaso5.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", 1, 3);
        } else {//no son iguales
            tablaPaso5.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", 1, 3);
            countErrores++;
        }
        currentValue = MD5.getMatrizValores()[0][17]; 
        userInput = MyCellEditor.cleanText((String) tablaPaso5.getValueAt(2,0));
        if (compararIgualdadTextos(currentValue, (String)userInput)){
            tablaPaso5.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", 2, 0);
        } else {//no son iguales
            tablaPaso5.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", 2, 0);
            countErrores++;
        }
        currentValue = MD5.getMatrizValores()[3][17]; 
        userInput = MyCellEditor.cleanText((String) tablaPaso5.getValueAt(2,1));
        if (compararIgualdadTextos(currentValue, (String)userInput)){
            tablaPaso5.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", 2, 1);
        } else {//no son iguales
            tablaPaso5.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", 2, 1);
            countErrores++;
        }
        currentValue = MD5.getMatrizValores()[2][17]; 
        userInput = MyCellEditor.cleanText((String) tablaPaso5.getValueAt(2,2));
        if (compararIgualdadTextos(currentValue, (String)userInput)){
            tablaPaso5.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", 2, 2);
        } else {//no son iguales
            tablaPaso5.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", 2, 2);            
            countErrores++;
        }
        currentValue = MD5.getMatrizValores()[1][17]; 
        userInput = MyCellEditor.cleanText((String) tablaPaso5.getValueAt(2,3));
        if (compararIgualdadTextos(currentValue, (String)userInput)){
            tablaPaso5.setValueAt("<html><div style='color: green;'>"+userInput.toString()+"</div></html>", 2, 3);
        } else {//no son iguales
            tablaPaso5.setValueAt("<html><div style='color: red;'>"+userInput.toString()+"</div></html>", 2, 3);
            countErrores++;
        }
        if(countErrores > 0){
            JOptionPane.showMessageDialog(panelPaso5, "Usted tiene "+countErrores+" errores en la grilla", "Error", JOptionPane.ERROR_MESSAGE);
        }else{
            JOptionPane.showMessageDialog(panelPaso5, "Todos los valores ingresados en la grilla son correctos", "MD5", JOptionPane.INFORMATION_MESSAGE);
        }
        String resumen = "" + MD5.ejecutarMd5(mensajeAEncriptar.getText());        
        if (!compararIgualdadTextos(resumen, valorResumen.getText())){
            JOptionPane.showMessageDialog(panelPaso5, "El resumen ingresado es inválido", "Error", JOptionPane.ERROR_MESSAGE);
        }else{
            JOptionPane.showMessageDialog(panelPaso5, "El resumen ingresado es correcto", "MD5", JOptionPane.INFORMATION_MESSAGE);
        }
    }//GEN-LAST:event_botonValidarPaso5ActionPerformed

    private void tablaPaso5MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaPaso5MouseClicked
            tablaPaso5.updateUI();
            handleGrillaEventsPaso5(evt);
    }//GEN-LAST:event_tablaPaso5MouseClicked

    private void tablaPaso5MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaPaso5MousePressed
            handleGrillaEventsPaso5(evt);
    }//GEN-LAST:event_tablaPaso5MousePressed

    private void tablaPaso5MouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaPaso5MouseExited
            tablaPaso5.updateUI(); 
    }//GEN-LAST:event_tablaPaso5MouseExited

    private void tablaPaso5MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaPaso5MouseDragged
         tablaPaso5.updateUI(); 
    }//GEN-LAST:event_tablaPaso5MouseDragged

    private void botonCompletarGrillaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCompletarGrillaActionPerformed
        completarGrilla(4, 16, false);
        botonSiguientePaso4AE.setEnabled(true);  
    }//GEN-LAST:event_botonCompletarGrillaActionPerformed

    private void buttonValidarAdicionBits1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonValidarAdicionBits1ActionPerformed
        String msgAEncriptar = mensajeAEncriptar.getText();

        if (!msgAEncriptar.equals("")) {
                String msgBinario = MD5.textoEnBinario(msgAEncriptar, true);
                if (compararIgualdadTextos(msgBinario, representacionBinaria.getText())) {
                    JOptionPane.showMessageDialog(IntroMD5, "La representacion binaria es correcta!", "MD5", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    JOptionPane.showMessageDialog(IntroMD5, "La representacion binaria es invalida!", "MD5", JOptionPane.ERROR_MESSAGE);
                }
                String msgPadeado = MD5.textoPadeado(msgAEncriptar, msgAEncriptar.length(), true);
                if (compararIgualdadTextos(msgPadeado, representacionBinMasRelleno.getText())) {
                    botonSiguientePaso1AE.setEnabled(true);
                    buttonGuardarArchivoPaso1.setEnabled(true);
                    JOptionPane.showMessageDialog(IntroMD5, "La representacion binaria más el relleno es correcto!", "MD5", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    JOptionPane.showMessageDialog(IntroMD5, "La representacion binaria más el relleno es invalido!", "MD5", JOptionPane.ERROR_MESSAGE);
                }
        } else {
                JOptionPane.showMessageDialog(IntroMD5, "Debe ingresar un texto a encriptar!", TOOL_TIP_TEXT_KEY, WIDTH);
        }
    }//GEN-LAST:event_buttonValidarAdicionBits1ActionPerformed

    private void buttonGuardarArchivoPaso2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonGuardarArchivoPaso2ActionPerformed
         saveFile(2);
    }//GEN-LAST:event_buttonGuardarArchivoPaso2ActionPerformed

    private void buttonGuardarArchivoPaso3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonGuardarArchivoPaso3ActionPerformed
        saveFile(3);        
    }//GEN-LAST:event_buttonGuardarArchivoPaso3ActionPerformed

    private void buttonGuardarArchivoPaso4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonGuardarArchivoPaso4ActionPerformed
        saveFile(4);
    }//GEN-LAST:event_buttonGuardarArchivoPaso4ActionPerformed

    private void buttonGuardarArchivoPaso5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonGuardarArchivoPaso5ActionPerformed
        saveFile(5);
    }//GEN-LAST:event_buttonGuardarArchivoPaso5ActionPerformed

    public void handleGrillaEventsPaso5(java.awt.event.ComponentEvent evt){
       
        if (tablaPaso5.getCellEditor() != null) {
                this.selectedColumnForEdit = tablaPaso5.getSelectedRow();
                this.selectedRowForEdit = tablaPaso5.getSelectedColumn()-1;
        }
    }
    
    public void handleGrillaEvents(java.awt.event.ComponentEvent evt){
       
        if (tablaPaso4.getCellEditor() != null) {
                this.selectedColumnForEdit = tablaPaso4.getSelectedRow();
                this.selectedRowForEdit = tablaPaso4.getSelectedColumn()-1;
        }
    }
    
    public String getSelectedButtonText(ButtonGroup buttonGroup) {
        for (Enumeration<AbstractButton> buttons = buttonGroup.getElements(); buttons.hasMoreElements();) {
            AbstractButton button = buttons.nextElement();

            if (button.isSelected()) {
                return button.getText();
            }
        }

        return null;
    }
        
    private void resetearPreguntas(){
        this.rbcorrecto1.setForeground(Color.black);
        this.rbcorrecto2.setForeground(Color.black);
        this.rbcorrecto3.setForeground(Color.black);
        this.rbcorrecto4.setForeground(Color.black);
        this.rbcorrecto5.setForeground(Color.black);
        this.grupoPreg1.clearSelection();
        this.grupoPreg2.clearSelection();
        this.grupoPreg3.clearSelection();
        this.grupoPreg4.clearSelection();
        this.grupoPreg5.clearSelection();
        this.botContinuarPreguntas.setEnabled(false);
        this.botCorregirPreguntas.setEnabled(true);
        this.botReintentarPreguntas.setEnabled(false);
        this.botResolverPreguntas.setEnabled(true);
    }
    
    MD5 md5 = new MD5();
    int iteracionRonda1 = 0;    int iteracionRonda2 = 0;    int iteracionRonda3 = 0;    int iteracionRonda4 = 0;
    int pasos= 0; int limitei= 0; int limitej= 0;
    int ianterior = 0; int janterior = 0;    
    private int selectedColumnForEdit = -1;
    private int selectedRowForEdit = -1;
    
    void load(MD5DTO md5DTO) {
        MD5.ejecutarMd5(this.mensajeAEncriptar.getText());
        int step = md5DTO.getCurrentStep();
        
        switch(step){
            case 1 : 
                this.mensajeAEncriptar.setText(md5DTO.getMessage());
                this.representacionBinaria.setText(md5DTO.getBinaryMessage());
                this.representacionBinMasRelleno.setText(md5DTO.getRepresentationBitsPlusFiller());
                jTabbedPane1.setEnabledAt(0, true);
                jTabbedPane1.setEnabledAt(1, true);
                jTabbedPane1.setSelectedIndex(1);
                break;
            case 2 : 
                this.mensajeAEncriptar.setText(md5DTO.getMessage());
                this.representacionBinaria.setText(md5DTO.getBinaryMessage());
                this.representacionBinMasRelleno.setText(md5DTO.getRepresentationBitsPlusFiller());
                this.representacionBinariaMasLongitud.setText(md5DTO.getRepresentationBitsPlusLong());
                jTabbedPane1.setEnabledAt(1, true);
                jTabbedPane1.setEnabledAt(2, true);
                jTabbedPane1.setSelectedIndex(2);
                break;
            case 3:    
                this.mensajeAEncriptar.setText(md5DTO.getMessage());
                this.representacionBinaria.setText(md5DTO.getBinaryMessage());
                this.representacionBinMasRelleno.setText(md5DTO.getRepresentationBitsPlusFiller());
                this.representacionBinariaMasLongitud.setText(md5DTO.getRepresentationBitsPlusLong());
                this.valorInicialA.setText(md5DTO.getInitialValueA());
                this.valorInicialB.setText(md5DTO.getInitialValueB());
                this.valorInicialC.setText(md5DTO.getInitialValueC());
                this.valorInicialD.setText(md5DTO.getInitialValueD());
                jTabbedPane1.setEnabledAt(1, true);
                jTabbedPane1.setEnabledAt(2, true);
                jTabbedPane1.setEnabledAt(3, true);
                jTabbedPane1.setSelectedIndex(3);
                break;
            case 4:
                this.mensajeAEncriptar.setText(md5DTO.getMessage());
                this.representacionBinaria.setText(md5DTO.getBinaryMessage());
                this.representacionBinMasRelleno.setText(md5DTO.getRepresentationBitsPlusFiller());
                this.representacionBinariaMasLongitud.setText(md5DTO.getRepresentationBitsPlusLong());
                this.valorInicialA.setText(md5DTO.getInitialValueA());
                this.valorInicialB.setText(md5DTO.getInitialValueB());
                this.valorInicialC.setText(md5DTO.getInitialValueC());
                this.valorInicialD.setText(md5DTO.getInitialValueD());
                String [][] matrizActualPaso4 = md5DTO.getMatrixStep4();
                for (int i = 0; i < 16; i++) {
                    for (int j = 0; j < 4; j++) {
                        tablaPaso4.setValueAt(matrizActualPaso4[i][j], i, j+1);
                    }
                }
                jTabbedPane1.setEnabledAt(1, true);
                jTabbedPane1.setEnabledAt(2, true);
                jTabbedPane1.setEnabledAt(3, true);
                jTabbedPane1.setEnabledAt(4, true);
                jTabbedPane1.setSelectedIndex(4);
                break;
            case 5:
                this.mensajeAEncriptar.setText(md5DTO.getMessage());
                this.representacionBinaria.setText(md5DTO.getBinaryMessage());
                this.representacionBinMasRelleno.setText(md5DTO.getRepresentationBitsPlusFiller());
                this.representacionBinariaMasLongitud.setText(md5DTO.getRepresentationBitsPlusLong());
                this.valorInicialA.setText(md5DTO.getInitialValueA());
                this.valorInicialB.setText(md5DTO.getInitialValueB());
                this.valorInicialC.setText(md5DTO.getInitialValueC());
                this.valorInicialD.setText(md5DTO.getInitialValueD());
                String [][] matrizActualStep4 = md5DTO.getMatrixStep4();
                for (int i = 0; i < 16; i++) {
                    for (int j = 0; j < 4; j++) {
                        tablaPaso4.setValueAt(matrizActualStep4[i][j], i, j+1);
                    }
                }
                this.valorResumen.setText(md5DTO.getResumeValue());
                String [][] matrizActual = md5DTO.getMatrixStep5();
                for (int i = 0; i < 3; i++) {
                    for (int j = 0; j < 4; j++) {
                        tablaPaso5.setValueAt(matrizActual[i][j], i, j);
                    }
                }
                jTabbedPane1.setEnabledAt(1, true);
                jTabbedPane1.setEnabledAt(2, true);
                jTabbedPane1.setEnabledAt(3, true);
                jTabbedPane1.setEnabledAt(4, true);
                jTabbedPane1.setEnabledAt(5, true);
                jTabbedPane1.setSelectedIndex(5);
                break;
            default:break;
        }
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel IntroMD5;
    private javax.swing.JButton botContinuarPreguntas;
    private javax.swing.JButton botCorregirPreguntas;
    private javax.swing.JButton botReintentarPreguntas;
    private javax.swing.JButton botResolverPreguntas;
    private javax.swing.JButton botonCompletarGrilla;
    private javax.swing.JButton botonMostrarGrillaCompleta;
    private javax.swing.JButton botonMostrarMensajeConLongitud;
    private javax.swing.JButton botonMostrarPaso5;
    private javax.swing.JButton botonMostrarVariablesConcat;
    private javax.swing.JButton botonSiguientePaso1AE;
    private javax.swing.JButton botonSiguientePaso2AE;
    private javax.swing.JButton botonSiguientePaso3AE;
    private javax.swing.JButton botonSiguientePaso4AE;
    private javax.swing.JButton botonValidarMensajeConLongitud;
    private javax.swing.JButton botonValidarPaso5;
    private javax.swing.JButton botonValidarVariablesConcat;
    private javax.swing.ButtonGroup buttonGroupPasos;
    private javax.swing.JButton buttonGuardarArchivoPaso1;
    private javax.swing.JButton buttonGuardarArchivoPaso2;
    private javax.swing.JButton buttonGuardarArchivoPaso3;
    private javax.swing.JButton buttonGuardarArchivoPaso4;
    private javax.swing.JButton buttonGuardarArchivoPaso5;
    private javax.swing.JButton buttonMostrarAdicionBits;
    private javax.swing.JButton buttonValidarAdicionBits1;
    private javax.swing.ButtonGroup grupoPreg1;
    private javax.swing.ButtonGroup grupoPreg2;
    private javax.swing.ButtonGroup grupoPreg3;
    private javax.swing.ButtonGroup grupoPreg4;
    private javax.swing.ButtonGroup grupoPreg5;
    private javax.swing.JLabel hashSalida;
    private javax.swing.JButton jButton16;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel16;
    private javax.swing.JLabel jLabel17;
    private javax.swing.JLabel jLabel18;
    private javax.swing.JLabel jLabel19;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel25;
    private javax.swing.JLabel jLabel26;
    private javax.swing.JLabel jLabel31;
    private javax.swing.JLabel jLabel32;
    private javax.swing.JLabel jLabel33;
    private javax.swing.JLabel jLabel34;
    private javax.swing.JLabel jLabel35;
    private javax.swing.JLabel jLabel36;
    private javax.swing.JLabel jLabel37;
    private javax.swing.JLabel jLabel38;
    private javax.swing.JLabel jLabel39;
    private javax.swing.JLabel jLabel40;
    private javax.swing.JLabel jLabel41;
    private javax.swing.JLabel jLabel42;
    private javax.swing.JLabel jLabel43;
    private javax.swing.JLabel jLabel44;
    private javax.swing.JLabel jLabel45;
    private javax.swing.JLabel jLabel46;
    private javax.swing.JLabel jLabel47;
    private javax.swing.JLabel jLabel48;
    private javax.swing.JLabel jLabel49;
    private javax.swing.JLabel jLabel50;
    private javax.swing.JLabel jLabel51;
    private javax.swing.JLabel jLabel52;
    private javax.swing.JLabel jLabel53;
    private javax.swing.JLabel jLabel54;
    private javax.swing.JLabel jLabel55;
    private javax.swing.JLabel jLabel56;
    private javax.swing.JLabel jLabel57;
    private javax.swing.JLabel jLabel58;
    private javax.swing.JLabel jLabel59;
    private javax.swing.JLabel jLabel60;
    private javax.swing.JLabel jLabel66;
    private javax.swing.JLabel jLabel67;
    private javax.swing.JLabel jLabel68;
    private javax.swing.JLabel jLabel80;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JScrollPane jScrollPane5;
    private javax.swing.JScrollPane jScrollPane6;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JLabel lblHeaderPaso3;
    private javax.swing.JTextField mensajeAEncriptar;
    private javax.swing.JPanel panelPaso1;
    private javax.swing.JPanel panelPaso2;
    private javax.swing.JPanel panelPaso3;
    private javax.swing.JPanel panelPaso4;
    private javax.swing.JPanel panelPaso5;
    private javax.swing.JRadioButton rbcorrecto1;
    private javax.swing.JRadioButton rbcorrecto2;
    private javax.swing.JRadioButton rbcorrecto3;
    private javax.swing.JRadioButton rbcorrecto4;
    private javax.swing.JRadioButton rbcorrecto5;
    private javax.swing.JRadioButton rbincorrecto12;
    private javax.swing.JRadioButton rbincorrecto13;
    private javax.swing.JRadioButton rbincorrecto14;
    private javax.swing.JRadioButton rbincorrecto15;
    private javax.swing.JRadioButton rbincorrecto2;
    private javax.swing.JRadioButton rbincorrecto3;
    private javax.swing.JRadioButton rbincorrecto31;
    private javax.swing.JRadioButton rbincorrecto32;
    private javax.swing.JRadioButton rbincorrecto41;
    private javax.swing.JRadioButton rbincorrecto42;
    private javax.swing.JTextArea representacionBinMasRelleno;
    private javax.swing.JTextArea representacionBinaria;
    private javax.swing.JTextArea representacionBinariaMasLongitud;
    private javax.swing.JLabel sumaFinal;
    private javax.swing.JTable tablaPaso4;
    private javax.swing.JTable tablaPaso5;
    private javax.swing.JTextField valorInicialA;
    private javax.swing.JTextField valorInicialB;
    private javax.swing.JTextField valorInicialC;
    private javax.swing.JTextField valorInicialD;
    private javax.swing.JTextField valorResumen;
    // End of variables declaration//GEN-END:variables
}
